<?php
/**
 * 文件存储类
 */

namespace LicenseSDK\Storage;

use LicenseSDK\Exceptions\LicenseException;

class FileStorage
{
    /**
     * 文件路径
     * @var string
     */
    private $filePath;
    
    /**
     * 构造函数
     * 
     * @param string $filePath
     */
    public function __construct($filePath)
    {
        $this->filePath = $filePath;
    }
    
    /**
     * 读取数据
     * 
     * @return array|null
     */
    public function read()
    {
        if (!file_exists($this->filePath)) {
            return null;
        }
        
        try {
            $content = file_get_contents($this->filePath);
            
            if ($content === false) {
                return null;
            }
            
            // 解码数据
            $data = $this->decode($content);
            
            return $data;
        } catch (\Exception $e) {
            return null;
        }
    }
    
    /**
     * 写入数据
     * 
     * @param array $data
     * @return bool
     * @throws LicenseException
     */
    public function write(array $data)
    {
        try {
            // 确保目录存在
            $dir = dirname($this->filePath);
            if (!is_dir($dir)) {
                if (!mkdir($dir, 0755, true)) {
                    throw new LicenseException('无法创建目录: ' . $dir);
                }
            }
            
            // 编码数据
            $content = $this->encode($data);
            
            // 写入文件
            $result = file_put_contents($this->filePath, $content, LOCK_EX);
            
            if ($result === false) {
                throw new LicenseException('无法写入文件: ' . $this->filePath);
            }
            
            // 设置文件权限
            @chmod($this->filePath, 0644);
            
            return true;
        } catch (\Exception $e) {
            throw new LicenseException('写入文件失败: ' . $e->getMessage());
        }
    }
    
    /**
     * 删除文件
     * 
     * @return bool
     */
    public function delete()
    {
        if (file_exists($this->filePath)) {
            return @unlink($this->filePath);
        }
        
        return true;
    }
    
    /**
     * 编码数据
     * 
     * @param array $data
     * @return string
     */
    private function encode(array $data)
    {
        // JSON编码
        $json = json_encode($data);
        
        // Base64编码（简单混淆）
        $encoded = base64_encode($json);
        
        // 添加标记
        return '===LICENSE===' . $encoded . '===END===';
    }
    
    /**
     * 解码数据
     * 
     * @param string $content
     * @return array|null
     */
    private function decode($content)
    {
        // 移除标记
        $content = str_replace(['===LICENSE===', '===END==='], '', $content);
        
        // Base64解码
        $decoded = base64_decode($content);
        
        if ($decoded === false) {
            return null;
        }
        
        // JSON解码
        $data = json_decode($decoded, true);
        
        if (json_last_error() !== JSON_ERROR_NONE) {
            return null;
        }
        
        return $data;
    }
    
    /**
     * 检查文件是否存在
     * 
     * @return bool
     */
    public function exists()
    {
        return file_exists($this->filePath);
    }
}

